home *** CD-ROM | disk | FTP | other *** search
- * ============================================================================ *
- * SectRect: Calculate the intersection of two rectangles
- *
- * BOOL SectRect(struct IBox *a, struct IBox *b, struct IBox *result);
- * a0 a1 a2
- * ============================================================================ *
-
- include 'intuition/intuition.i'
-
- SECTION sectrect.asm,CODE
-
- xdef _SectRect
- _SectRect: ; (a0, a1, a2)
-
- ; x1 = MAX(a->Left, b->Left);
-
- move.w ibox_Left(a0),d0
- move.w ibox_Left(a1),d1
- move.w d0,ibox_Left(a2)
- cmp.w d0,d1
- blt.s 1$
- move.w d1,ibox_Left(a2)
- 1$
-
- ; x2 = MIN(a->Left + a->Width, b->Left + b->Width) - x1;
-
- add.w ibox_Width(a0),d0
- add.w ibox_Width(a1),d1
- cmp.w d0,d1
- bgt.s 2$
- move.w d1,d0
- 2$ sub.w ibox_Left(a2),d0
- bpl.s 20$
- moveq #0,d0
- 20$ move.w d0,ibox_Width(a2)
-
- ; y1 = MAX(a->Top, b->Top);
-
- move.w ibox_Top(a0),d0
- move.w ibox_Top(a1),d1
- move.w d0,ibox_Top(a2)
- cmp.w d0,d1
- blt.s 3$
- move.w d1,ibox_Top(a2)
- 3$
- ; y2 = MIN(a->Top + a->Height, b->Top + b->Height) - y1;
-
- add.w ibox_Height(a0),d0
- add.w ibox_Height(a1),d1
- cmp.w d0,d1
- bgt.s 4$
- move.w d1,d0
- 4$ sub.w ibox_Top(a2),d0
- bpl.s 40$
- moveq #0,d0
- 40$ move.w d0,ibox_Height(a2)
-
- beq.s 50$ ; return TRUE if non-zero interior
- tst.w ibox_Width(a2)
- beq.s 50$
- moveq #1,d0
- 50$
- rts
-